"use client"; import { useState, useEffect } from "react"; import type z from "zod"; import { WhenToWriteToRecord, SalesforceFieldType } from "@calcom/app-store/salesforce/lib/enums"; import type { writeToRecordDataSchema as salesforceWriteToRecordDataSchema } from "@calcom/app-store/salesforce/zod"; import { routingFormIncompleteBookingDataSchema as salesforceRoutingFormIncompleteBookingDataSchema } from "@calcom/app-store/salesforce/zod"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { IncompleteBookingActionType } from "@calcom/prisma/enums"; import { trpc } from "@calcom/trpc/react"; import type { inferSSRProps } from "@calcom/types/inferSSRProps"; import { Button } from "@calcom/ui/components/button"; import { Switch } from "@calcom/ui/components/form"; import { InputField } from "@calcom/ui/components/form"; import { Select } from "@calcom/ui/components/form"; import { Label } from "@calcom/ui/components/form"; import { Icon } from "@calcom/ui/components/icon"; import { showToast } from "@calcom/ui/components/toast"; import SingleForm from "../../components/SingleForm"; import type { getServerSidePropsForSingleFormView as getServerSideProps } from "../../components/getServerSidePropsSingleForm"; import type { RoutingFormWithResponseCount } from "../../types/types"; function Page({ form }: { form: RoutingFormWithResponseCount }) { const { t } = useLocale(); const { data, isLoading } = trpc.viewer.appRoutingForms.getIncompleteBookingSettings.useQuery({ formId: form.id, }); const mutation = trpc.viewer.appRoutingForms.saveIncompleteBookingSettings.useMutation({ onSuccess: () => { showToast(t("success"), "success"); }, onError: (error) => { showToast(t(`error: ${error.message}`), "error"); }, }); const [salesforceWriteToRecordObject, setSalesforceWriteToRecordObject] = useState< z.infer >({}); // Handle just Salesforce for now but need to expand this to other apps const [salesforceActionEnabled, setSalesforceActionEnabled] = useState(false); const fieldTypeOptions = [{ label: t("text"), value: SalesforceFieldType.TEXT }]; const [selectedFieldType, setSelectedFieldType] = useState(fieldTypeOptions[0]); const whenToWriteToRecordOptions = [ { label: t("on_every_instance"), value: WhenToWriteToRecord.EVERY_BOOKING }, { label: t("only_if_field_is_empty"), value: WhenToWriteToRecord.FIELD_EMPTY }, ]; const [selectedWhenToWrite, setSelectedWhenToWrite] = useState(whenToWriteToRecordOptions[0]); const [newSalesforceAction, setNewSalesforceAction] = useState({ field: "", fieldType: selectedFieldType.value, value: "", whenToWrite: WhenToWriteToRecord.FIELD_EMPTY, }); const credentialOptions = data?.credentials.map((credential) => ({ label: credential.team?.name, value: credential.id, })); const [selectedCredential, setSelectedCredential] = useState( Array.isArray(credentialOptions) ? credentialOptions[0] : null ); useEffect(() => { const salesforceAction = data?.incompleteBookingActions.find( (action) => action.actionType === IncompleteBookingActionType.SALESFORCE ); if (salesforceAction) { setSalesforceActionEnabled(salesforceAction.enabled); const parsedSalesforceActionData = salesforceRoutingFormIncompleteBookingDataSchema.safeParse( salesforceAction.data ); if (parsedSalesforceActionData.success) { setSalesforceWriteToRecordObject(parsedSalesforceActionData.data?.writeToRecordObject ?? {}); } setSelectedCredential( credentialOptions ? credentialOptions.find((option) => option.value === salesforceAction?.credentialId) ?? selectedCredential : selectedCredential ); } }, [data]); if (isLoading) { return
Loading...
; } return ( <>
<>
Write to Salesforce contact/lead record
{ setSalesforceActionEnabled(checked); }} />
{salesforceActionEnabled ? (
{form.team && ( <>
option.value === action.fieldType)} isDisabled={true} />
{ if (e) { setSelectedFieldType(e); setNewSalesforceAction({ ...newSalesforceAction, fieldType: e.value, }); } }} />
setNewSalesforceAction({ ...newSalesforceAction, value: e.target.value, }) } />